home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #1 / Ham Radio 2000.iso / ham2000 / packet / terminal / top148h / util.exe / KEYDRV / KEYBOARD.ASM < prev    next >
Encoding:
Assembly Source File  |  1992-02-10  |  10.7 KB  |  433 lines

  1. ;   Mini-Tastaturtreiber, J. Tucht, 31.10.1990
  2. ;
  3. ;   Assemblierung für Aufruf von der COMMAND-Ebene:
  4. ;
  5. ;     masm keyboard;
  6. ;     link keyboard;
  7. ;     exe2bin keyboard keyboard.com
  8. ;
  9. ;   Assemblierung für Einbindung in CONFIG.SYS:
  10. ;
  11. ;     masm keyboard /dConfigSys;
  12. ;     link keyboard;
  13. ;     exe2bin keyboard
  14. ;
  15. ;   MASM 3.0 schluckt den /D-Switch nicht.
  16. ;   Ggf. am Anfang des Quelltextes "ConfigSys EQU 1" einfügen!
  17. ;
  18.  
  19. CapsLockBit EQU 40h    ;im Tastatur-Status-Register
  20.  
  21. ;-----------------------------------------------------------------
  22. ;Makros für Übersetzungstabellen.
  23. ;-----------------------------------------------------------------
  24.  
  25. Primary MACRO
  26. Key 29h,'^'
  27. Key 0Ch,'ß'
  28. Key 0Dh,"'"
  29. Key 2Bh,'#'
  30. Key 1Bh,'+'
  31. Key 35h,'-'
  32. Key 56h,'<'
  33. ENDM
  34.  
  35. Shift MACRO
  36. Key 29h,'°'
  37. Key 03h,'"'
  38. Key 04h,15h ;Paragraph (Ctrl-U) - bevorzugen Sie hier '@'?
  39. Key 07h,'&'
  40. Key 08h,'/'
  41. Key 09h,'('
  42. Key 0Ah,')'
  43. Key 0Bh,'='
  44. Key 0Ch,'?'
  45. Key 0Dh,'`'
  46. Key 2Bh,"'"
  47. Key 1Bh,'*'
  48. Key 33h,';'
  49. Key 34h,':'
  50. Key 35h,'_'
  51. Key 56h,'>'
  52. ENDM
  53.  
  54. Ctrl MACRO
  55. Key 2Ch,19h ;Ctrl-Y (darf bei deutschem ROM-BIOS entfernt werden)
  56. Key 15h,1Ah ;Ctrl-Z (darf bei deutschem ROM-BIOS entfernt werden)
  57. ENDM
  58.  
  59. Alt MACRO
  60. Key 08h,'┤'
  61. ENDM
  62.  
  63. CtrlAlt MACRO
  64. Key 1Eh,'á'
  65. Key 12h,'é'
  66. Key 17h,'í'
  67. Key 18h,'ó'
  68. Key 16h,'ú'
  69. Key 03h,'²'
  70. Key 04h,'ⁿ'
  71. Key 10h,'@'
  72. Key 08h,'{'
  73. Key 09h,'['
  74. Key 0Ah,']'
  75. Key 0Bh,'}'
  76. Key 0Ch,'\'
  77. Key 1Bh,'~'
  78. Key 56h '|'
  79. ENDM
  80.  
  81. ShiftAlt MACRO
  82. Key 1Eh,'à'
  83. Key 12h,'è'
  84. Key 17h,'ì'
  85. Key 18h,'ò'
  86. Key 16h,'ù'
  87. Key 03h,'½' ;Shift-Alt-2
  88. Key 05h,'¼' ;Shift-Alt-4
  89. ENDM
  90.  
  91. CtrlShift MACRO
  92. Key 2Ch,19h ;Ctrl-Shift-Y wie Ctrl-Y
  93. Key 15h,1Ah ;Ctrl-Shift-Z wie Ctrl-Z
  94. Key 1Eh,'α' ;Ctrl-Shift-A
  95. Key 30h,'ß' ;Ctrl-Shift-B
  96. Key 2Eh,'τ' ;Ctrl-Shift-C
  97. Key 22h,'Γ' ;Ctrl-Shift-G
  98. Key 20h,'δ' ;Ctrl-Shift-D
  99. Key 19h,'π' ;Ctrl-Shift-P
  100. Key 1Fh,'σ' ;Ctrl-Shift-S
  101. Key 32h,'µ' ;Ctrl-Shift-M
  102. Key 18h,'Ω' ;Ctrl-Shift-O
  103. Key 21h,'Φ' ;Ctrl-Shift-F
  104. Key 12h,'ε' ;Ctrl-Shift-E
  105. Key 14h,'Θ' ;Ctrl-Shift-T
  106. Key 10h,'√' ;Ctrl-Shift-Q
  107. ENDM
  108.  
  109. CtrlShiftAlt MACRO
  110. Key 1Eh,'â'
  111. Key 12h,'ê'
  112. Key 17h,'î'
  113. Key 18h,'ô'
  114. Key 16h,'û'
  115. ENDM
  116.  
  117.  
  118. LowerCase MACRO
  119. Key 28h,'ä'
  120. Key 27h,'ö'
  121. Key 1Ah,'ü'
  122. Key 2Ch,'y'
  123. Key 15h,'z'
  124. ENDM
  125.  
  126. UpperCase MACRO
  127. Key 28h,'Ä'
  128. Key 27h,'Ö'
  129. Key 1Ah,'Ü'
  130. Key 2Ch,'Y'
  131. Key 15h,'Z'
  132. ENDM
  133.  
  134.  
  135. ScanXchg MACRO
  136. Key 2Ch,15h
  137. Key 15h,2Ch
  138. Key 79h,03h
  139. ENDM
  140.  
  141. ;nur bei deutschem ROM-BIOS:
  142. ;PURGE LowerCase,UpperCase
  143.  
  144. ;Sollen Scan-Codes unangetastet bleiben:
  145. ;PURGE ScanXchg
  146.  
  147. ;-----------------------------------------------------------------
  148. ;Vereinbarungen zum Thema Dezimalkomma - Dezimalpunkt
  149. ;-----------------------------------------------------------------
  150.  
  151. ;Begriffliche Klärung:
  152. ;Das "Dezimal-Dings" ist das Zeichen, das man erhält, wenn man
  153. ;bei eingeschalteter Num-Lock-Taste auf die Delete-Taste des
  154. ;Ziffernblocks drückt. Alles klar?
  155.  
  156. DezimalDings        EQU '.,' ;Liefere je nach CapsLock "." oder ","!
  157. RomDezimalDings     EQU '.'  ;Mein ROM liefert "." - ggf. anpassen!
  158.  
  159.  
  160. ;-----------------------------------------------------------------
  161. ;Allgemeine Makros
  162. ;-----------------------------------------------------------------
  163.  
  164. SetInt          MACRO Num,Ofs
  165.                 MOV AX,2500H+Num
  166.                 MOV DX,OFFSET Ofs
  167.                 INT 21H
  168.                 ENDM
  169.  
  170. GetInt          MACRO Num,Vector
  171.                 MOV AX,3500H+Num
  172.                 INT 21H
  173.                 MOV WORD PTR [Vector],BX
  174.                 MOV WORD PTR [Vector+2],ES
  175.                 ENDM
  176.  
  177. CODE            SEGMENT
  178.                 ASSUME CS:CODE,DS:CODE
  179.  
  180. ;-----------------------------------------------------------------
  181.                 IFDEF ConfigSys
  182. ;-----------------------------------------------------------------
  183.  
  184. EntryLabel      PROC FAR
  185.  
  186. ;Device Header
  187.  
  188.                 DD -1           ;Es folgen keine weiteren Treiber
  189.                 DW 8004h        ;NUL-Gerät ohne Zusatzfunktionen
  190. StrategyTrap    DW Strategy
  191. InstallTrap     DW Install
  192.                 ;   12345678
  193.                 DB "NUL     "   ;Gerätename
  194. Ignore:         RET
  195. EntryLabel      ENDP
  196.  
  197. ;-----------------------------------------------------------------
  198.                 ELSE ;IFNDEF ConfigSys
  199. ;-----------------------------------------------------------------
  200.  
  201.                 ORG 100h
  202. EntryLabel:     JMP Install
  203.  
  204. ;-----------------------------------------------------------------
  205.                 ENDIF
  206. ;-----------------------------------------------------------------
  207.  
  208. ;-----------------------------------------------------------------
  209. ;residenter Datenbereich
  210. ;-----------------------------------------------------------------
  211.  
  212.                 EVEN ;gerade Adresse erzwingen
  213.  
  214.  
  215. Setup MACRO Table
  216. Table&Size=0
  217. Key MACRO Key,Symbol
  218. DB LOW Symbol,Key
  219. Table&Size=Table&Size+1
  220. ENDM
  221. Table&Addr:
  222. ENDM
  223.  
  224.                 ; ────┐
  225. Setup Primary   ;     │
  226.                 ;     │
  227. LowerCase       ;     ├── CapsLock nicht aktiv
  228.                 ; ═╗  │   Shift nicht gedrückt
  229. Primary         ;  ║  │
  230.                 ; ─║──┘
  231. Setup Shift     ;  ╠════ CapsLock aktiv
  232.                 ; ─║──┐  Shift nicht gedrückt
  233. UpperCase       ;  ║  │
  234.                 ; ═╝  │
  235.                 ; ═╗  │
  236. Shift           ;  ║  ├── CapsLock nicht aktiv
  237.                 ; ─║──┘   Shift gedrückt
  238. Setup Caps      ;  ║
  239.                 ;  ║
  240. LowerCase       ;  ╠══ CapsLock aktiv
  241.                 ; ═╝   Shift gedrückt
  242.  
  243. IRP X,<Ctrl,Alt,CtrlShift,CtrlAlt,ShiftAlt,CtrlShiftAlt,ScanXchg>
  244. Setup X
  245. X
  246. ENDM
  247.  
  248. AddrIndex       DW PrimaryAddr,ShiftAddr
  249.                 DW CtrlAddr,CtrlShiftAddr
  250.                 DW AltAddr,ShiftAltAddr
  251.                 DW CtrlAltAddr,CtrlShiftAltAddr
  252.  
  253. SizeIndex       DB PrimarySize,ShiftSize
  254.                 DB CtrlSize,CtrlShiftSize
  255.                 DB AltSize,ShiftAltSize
  256.                 DB CtrlAltSize,CtrlShiftAltSize
  257.  
  258. E0Flag          DB 0
  259.  
  260. ;-----------------------------------------------------------------
  261. ;residenter Codebereich
  262. ;-----------------------------------------------------------------
  263.  
  264. KbdEvent:       CLD
  265.                 IRP XX,<DS,BX,AX,CX,ES,DI>
  266.                 PUSH XX
  267.                 ENDM
  268.                 PUSH CS
  269.                 POP ES
  270.                 MOV CX,40h      ;CH bleibt ab hier 0
  271.                 MOV DS,CX
  272.  
  273.                 XOR BX,BX
  274.  
  275.                 TEST BYTE PTR DS:[96h],8  ;RightAlt gedrückt?
  276.                 MOV AL,4+8                ;CtrlAlt vortäuschen
  277.                 JNZ $+5
  278.  
  279.                 MOV AL,DS:[17h] ;Flags für Shift/Ctrl/Alt/Caps
  280.  
  281.                 MOV DI,AX
  282.                 SHR AL,1
  283.                 JNC $+4
  284.                 OR AL,1
  285.                 AND AX,7
  286.  
  287.                 IF CapsSize
  288.                 TEST AL,6       ;setzt Z-Flag für Tabellen
  289.                 ENDIF           ;"Primary" und "Shift"
  290.  
  291.                 XCHG DI,AX
  292.                 MOV CL,CS:[SizeIndex+DI]
  293.                 ROL DI,1        ;ROL läßt Z-Flag unberührt!
  294.                 MOV DI,CS:[AddrIndex+DI]
  295.  
  296.                 IF CapsSize
  297.                 JNZ Scan
  298.                 TEST AL,CapsLockBit
  299.                 JZ Scan
  300.                 ADD DI,2*CapsSize   ;Ja, Versatz addieren!
  301.                 ENDIF
  302.  
  303. Scan:           IN AL,60h
  304.                 MOV AH,AL
  305.                 CMP CS:E0Flag,0E0h
  306.                 MOV CS:E0Flag,AL
  307.                 JZ ChainOld
  308.  
  309.                 JCXZ ChainOld   ;Schleife ggf. überspringen
  310.                 MOV AL,ES:[DI]
  311.                 SCASW
  312.                 LOOPNZ $-4
  313.                 JNZ ChainOld
  314.                 MOV BX,AX
  315. ChainOld:
  316.                 IF ScanXchgSize
  317.                 MOV DI,OFFSET ScanXchgAddr
  318.                 MOV CL,ScanXchgSize
  319.                 MOV AL,ES:[DI]
  320.                 SCASW
  321.                 LOOPNZ $-4
  322.                 JNZ $+4
  323.                 MOV BH,AL
  324.                 ENDIF
  325.  
  326.                 MOV AX,DS:[1Ch]
  327.                 PUSHF
  328.                 DB 9Ah          ;Intersegment Call
  329. OldKbdEvent     DD ?
  330.                 XCHG BX,AX
  331.  
  332.                 IF DezimalDings NE RomDezimalDings
  333.                 CMP WORD PTR [BX],5300h+RomDezimalDings
  334.                 JNZ Skip5
  335.                 MOV BYTE PTR [BX],LOW DezimalDings
  336.  
  337.                 IF DezimalDings/100h
  338.                 TEST BYTE PTR DS:[17h],CapsLockBit
  339.                 JZ Skip5
  340.                 MOV BYTE PTR [BX],HIGH DezimalDings
  341.                 ENDIF
  342. Skip5:
  343.                 ENDIF
  344.  
  345.                 OR AX,AX        ;Scan-Code oder Zeichen ändern?
  346.                 JZ Exit         ;Nein: Exit
  347.                 MOV [BX],AX     ;Ja: Zeichen im Puffer ablegen
  348.                 LEA AX,[BX+2]
  349.                 CMP AL,3Eh
  350.                 JNZ $+4
  351.                 MOV AL,1Eh
  352.                 CMP AX,DS:[1Ah]
  353.                 JZ Exit
  354.                 MOV DS:[1Ch],AX
  355. Exit:
  356.                 IRP XX,<DI,ES,CX,AX,BX,DS>
  357.                 POP XX
  358.                 ENDM
  359.  
  360.                 IRET
  361. ;-----------------------------------------------------------------
  362.                 IFDEF ConfigSys
  363. ;-----------------------------------------------------------------
  364.  
  365. Install         PROC FAR
  366.                 PUSH AX
  367.                 PUSH BX
  368.                 PUSH DX
  369.                 PUSH DS
  370.                 PUSH ES
  371.  
  372.                 PUSH CS
  373.                 POP DS
  374.  
  375.                 GetInt 9h,OldKbdEvent
  376.                 SetInt 9h,KbdEvent
  377.  
  378. ;Regulären Eintrittspunkt im Device-Header vermerken
  379.  
  380.                 MOV AX,OFFSET Ignore
  381.                 MOV StrategyTrap,AX
  382.                 MOV InstallTrap,AX
  383.                 MOV DX,OFFSET OkMsg
  384.                 MOV AH,9
  385.                 INT 21h
  386.  
  387. ;Treiber-Ende und Status im Request Header vermerken
  388.  
  389.                 LDS BX,RequestPtr
  390.                 MOV WORD PTR [BX+14],OFFSET Install
  391.                 MOV [BX+16],CS
  392.                 MOV WORD PTR [BX+3],300h
  393.                 POP ES
  394.                 POP DS
  395.                 POP DX
  396.                 POP BX
  397.                 POP AX
  398.                 RET
  399.  
  400. Strategy:       MOV WORD PTR CS:RequestPtr,BX
  401.                 MOV WORD PTR CS:RequestPtr+2,ES
  402.                 RET
  403.  
  404. RequestPtr      DD ?          ;Zeiger auf Request-Header
  405.  
  406. Install         ENDP
  407.  
  408. ;-----------------------------------------------------------------
  409.                 ELSE ;IFNDEF ConfigSys
  410. ;-----------------------------------------------------------------
  411.  
  412. Install:        MOV DX,OFFSET OkMsg
  413.                 MOV AH,9
  414.                 INT 21h
  415.  
  416.                 GetInt 9h,OldKbdEvent
  417.                 SetInt 9h,KbdEvent
  418.  
  419.                 MOV DX,OFFSET Install
  420.                 INT 27h      ;resident bleiben
  421.  
  422. ;-----------------------------------------------------------------
  423.                 ENDIF
  424. ;-----------------------------------------------------------------
  425.  
  426. OkMsg           DB 13,10,'Tastaturtreiber geladen...'
  427.                 DB 13,10,'$'
  428.  
  429. CODE            ENDS
  430. END             EntryLabel ;Return nicht vergessen!
  431.  
  432.  
  433.